查看原文
其他

奇虎 360 温铭:Nginx + Lua 高性能 Web 平台OpenResty 的未来

2016-09-18 开源中国 开源中国


#点击上图,立即参与OSC源创会年终盛典#

2016年9月10日,第52期【OSC源创会】在珠海圆满落幕,350余名OSCer齐聚报业大厦,聆听了一场诚意满满、干货多多的技术分享盛会。

本期源创会由5位讲师分别针对5个不同的主题进行分享,为给未能到现场以及参与活动后仍意犹未尽的OSCer更好的了解和学习,开源中国将每位讲师的演讲内容进行了整理,并将逐一发布。干货多多,不容错过!


OpenResty 是把 Nginx 和 Lua 有机融合在一起的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。本期,奇虎360技术开源委员会委员、OpenResty 软件基金会主席温铭,对 OpenResty的技术链、近一年以来的新增特性、社区的发展以及未来的规划进了分享。完整演讲内容如下:


大家好,首先简单做个自我介绍,我是温铭,在珠海呆了快十年,前面四五年在金山做个人软件,后面四五年在360做企业软件。 

首先说一下,由于只有半小时左右的演讲时间,所以不会涉及到很深入的东西。我希望大家通过我这次演讲,之前没有接触过 OpenResty 的,听完后会觉得还有点意思,有兴趣去搜索了解一下,去自己电脑上跑个“Hello World”, 在后面做技术选型的时候有新的一个选择,那我就觉得这个演讲的目的已经达到了。 

OpenResty 最近曝光最多的是在去年锤子的发布会上获得了锤子一百万的捐赠,其他时间的曝光率并不是特别高。接下来我会大概跟大家说一下 OpenResty 还有 OpenResty 社区的特性和发展。 

其实不仅是 OpenResty 社区,对任何一个开源社区来说,未来的发展在我看来都取决于两个方面,一个是它的技术,是不是能解决一些真实的环境、公司业务里面遇到的问题,还有一个就是它的社区和社区的发展,你的社区做的怎么样,很大的情况下会决定你的开源软件未来会是怎样的发展。 


下图是去年10月份 OpenResty 在北京举行的第一次大会,这些都是当时的一些讲师,最中间的是 OpenResty 的作者章亦春,其他的大部分来自于 CDN 行业和云厂商。但其实 OpenResty 的用户不止于 CDN 公司和云厂商,只不过在这些公司和厂商的服务端上,OpenResty 应用非常广泛,在 CDN 行业 OpenResty 已经是事实上的一个标准。京东是我们在国内最大的一个 OpenResty 用户,你在京东上看到的所有商品详情页的调用都是基于 OpenResty 做的。还有新浪财经、新浪股票和新浪体育所有的后端,包括360搜索页面的跳转,同样都是基于 OpenResty。在国外大家比较常用的 Github、CloudFlare 也都有用 OpenResty 做一些服务。 


 

OpenResty 是什么?

简单来说,它不像 Golang 一样,是凭空从零搭建的,而是把 Nginx 和 Lua 有机融合在一起,站在两位巨人肩膀上诞生的。特别有意思的是,我们平常用到的绝大部分的互联网技术都是基于欧美的,但是这三个技术,Nginx 是俄罗斯的,Lua 的作者是巴西的,OpenResty 的作者是中国的。 


 

OpenResty 的好处

说白了就是可以用脚本语言,用 Lua 来控制 Nginx 的行为。就比如说刚才魅族的于讲师有讲到他们用C++去做控制,要自己实现协程,但是在 OpenResty 里面,它像 Golang 一样天生就有协程。还有一个好处是,OpenResty 所有的参数和行为都可以在程序里面动态的去做,完全不用重启和reload,因为它是基于 Nginx 之上的,性能非常高。所以如果你有一个高性能的场景,除了 Golang 之外,OpenResty 也是很好的选择。 

在说到 OpenResty 时,更多人可能听说过的是 ngx_lua。这其实也是有历史原因的,因为有很多项目是在原生的 Nginx 版本里面嵌入了 ngx_lua 这个模块,来做到刚才说的动态控制。但事实上,ngx_lua 只是 OpenResty 里面的一小部分。OpenResty 这个开源项目下面有50多个小项目,都是和OpenResty、Nginx、Lua相关的。 

我大概列了其中的十几个项目。首先,我们知道测试在开源项目里面是特别重要的,但我们其实是很难做到类似于测试驱动开发、测试代码覆盖率、自动化测试、CI等等,这种东西听起来很美好,但做起来难度很高。OpenResty 是我见过在开源项目里面测试这一块做的最好的,后面会单独来讲一下这块。此外,OpenResty 做的比较好的还有动态跟踪,我们可以不做侵入性的修改,就能发现问题所在。还有像是客户端文档、二进制包、docker 包等等。 


 

测试

前段时间我在公司内部给新员工做培训时有说这样一句话,测试是区别程序员和程序猿的一个标准。你是机械的在工作,还是会经常思考怎么样提高生产力的在工作,区别就是在测试这一块。 

测试其实是很多程序员不愿意做的事,但测试又确实特别重要,用章亦春春哥的话说就是,你如果没有做测试,那你晚上会睡不着觉,因为不知道发版本的时候程序能不能跑起来;但是如果你做了测试,那你发版本的时候就可以很安心的睡觉,因为程序肯定可以跑得起来。当然,前提是测试的设计要好,要有科学的方法,这其实也是一门艺术。这个网址  会显示OpenResty下面各个项目的测试运行情况,有需要的可以去看看。 

测试这一块还值得一提的是 Test::Nginx,它会给每一个测试案例起一个 Nginx 实例,在里面把一些测试按钮跑完后,Nginx 的环境就会自动清掉;当下一次进行测试时,再重新起一个Nginx 实例。它是用自己定义的一套语法来描述测试案例要怎么跑、预期的结果会是怎样、你需要预备一些什么数据等等。另外就是mock,在Nginx、OpenResty 测试中也是较常使用的,比如说你访问的 redis 返回一个错误码,而你在正常的测试环境是很难遇到的。再比如 mockeagain,这个开源项目其实是比较适用很特殊的情况,比如模拟网络非常缓慢的时候。 


 

动态追踪

说完测试来聊聊动态追踪,这个是 OpenResty 里面非常有特色的一个点。动态追踪是指我们在线上跑一个服务,当出现问题时,动态追踪可以不改一行代码、甚至在不知道别人代码如何实现的情况下,找到问题所在。它可以帮助软件工程师以非常低的成本,在非常短的时间内,跟踪程序的运行情况,并给出直观的图表,从而更快速地排查和解决问题。下图是一个动态追踪的火焰图,图中的颜色深浅其实是没有意义的,它就是对程序占用 CPU 做了一次采样,再进行绘制。正常情况是左边的驼峰形状,当出现图中右边的情况则说明了这是问题所在,可以直接看到是哪个函数占了 CPU 资源。 

现在的调试工具是很乱、很不统一的,像是有 DTrace、SystemTap、ePBF/BCC、GDB、LLDB 这些。我们希望做到的是能有一种语言将所有调试相关的东西,包括静态和动态,都能解决掉。这个语言我们称为Y语言,其实就是英文的“WHY”谐音。前面说到的所有调试相关的东西,春哥写了一篇文章, ,有兴趣的可以去看看。 


 

标准库

那说完调试,来说说标准库。下图所列的都是 OpenResty 中自带的标准库,包括字符串的处理、上游的处理,还有一些缓存和其它常见的处理。 


 

Web框架

再有是 web 框架,在OpenResty里面,你要写一个框架非常简单,有大概20个开源项目都是做这种 web 框架的。 


 

数据库和存储

至于数据库和存储相关的第三方就更多了,都可以直接用 OpenResty 调用,不用自己写。

汇总链接如下: 


OpenResty 和其他语言相比有很不一样的特点,就是可以深入到业务当中去。举几个栗子: 

openresty.org 这个网站的 DNS 原本用的是dnspod,但 dnspod 在国外的服务不稳定,导致社区的用户对其不太满意,因此 OpenResty 自己写了一套 DNS。 

还有 WAF,其实目前好的 WAF 都没有开源,现在开源的 WAF 并没有一个特别好的环境去做到特别牛。OpenResty 社区也会去开发、开源一套比所有商业项目更好的一套 WAF。还有正则引擎,我们知道 WAF 的规则都是基于正则来做的,比如说,一个 WAF 有一万条规则,当一个请求进来,难道要匹配一万次?这明显是不能容忍的,但事实上很多开发者都是这么做的,我们希望做的是能够合并掉规则,到 WAF 运行的时候可能只有几条规则进行匹配。所以我们需要一个更好的正则引擎,这个引擎目前也在 OpenResty 的开源项目里。这个正则引擎的效率比目前已知的引擎效率要高,但是还需要测试。 

再有就是 DSL,就像之前说的 Y 语言,OpenResty 社区受创始人的影响,比较偏爱小语言。比如说当要用 Lua 写 OpenResty 代码,但很多人又不愿意学 Lua,那么就可以其他语言来做,再用 DSL 引擎将其底层变成 Lua 代码,实现代码的高度优化。 

这个是我们年初的时候发的roadmap,其中的第一个和第二个其实就是为了实现推送功能,都已经打包在最新的 OpenResty 稳定版中。第三个和第四个就是刚才说的 WAF,最后一个就是 DSL。 

前面讲了这么多,其实我们可以看到,贯穿 OpenResty 核心开发的就是合适你业务的小语言。你觉得哪个语言好,都可以将其特色挪过来,兼容并包。所以在 OpenResty 社区里面从来没有语言方面的冲突。 


说到社区,在我看来,OpenResty 的社区是这样的: 

首先,社区受创始人章亦春的影响非常大。之前有开玩笑说过,一个社区发展有没有前途,是看社区的创始人能活多少岁。对于社区来讲,创始人可以非常民主,也可以非常专治,而春哥则是“仁慈的君主”。当有小白用户在社区提问,他会很详细的列出1、2、3、4……进行解答,每天都在回复,一直坚持了五六年。 

社区目前主要是在邮件列表和微信群进行沟通,一般解答流程是先由委员会成员来回复,如果提问后2-3天没有收到委员会的回复或者回复错误,春哥会亲自回复,以保证所有的问题都能得到及时解答。另外也有 QQ 群,基本上国内所有的 OpenResty 开发者都在里面。 

当然,我们也有更长远的发展规划,我们一直在做 NPO,希望能永远的运营下去,脱离于单个人的影响。现在的 NPO 是以 OpenResty 软件基金会为主体,我们需要这个一个合法的机制来保证社区的长久运营。 

春哥正在写一本叫做 programming OpenResty 的书,到现在已经写了几个月,在写测试这块。另外,基金会也会赞助 OpenResty 本身以及更多相关技术的发展。 

谢谢!


PPT下载地址:


欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。转载时请注明:文章转载自开源中国公众号 (ID:oschina2013)


了解更多详情请点击“阅读原文”



开源中国|ID:oschina2013


每天为你送上精选资讯早点

还有每天的 OSChina 乱弹哦

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存